package com.sun.syndication.feed.module.wcm.io;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.jdom.Element;
import org.jdom.Namespace;

import com.sun.syndication.feed.module.Module;
import com.sun.syndication.feed.module.wcm.WCMModule;
import com.sun.syndication.feed.module.wcm.types.Component;
import com.sun.syndication.feed.module.wcm.types.Path;
import com.sun.syndication.feed.module.wcm.types.TemplateMap;
import com.sun.syndication.io.ModuleGenerator;

public class WCMModuleGenerator implements ModuleGenerator {

	public void generate(Module pModule, Element pElement) {
		WCMModule lvModule = (WCMModule) pModule;

		if (lvModule.getAction() != null) {
			Element lvActionElement = new Element(WCMModule.ACTION, IBMWCM_NS);
			lvActionElement.addContent(lvModule.getAction());
			pElement.addContent(lvActionElement);
		}

		if (lvModule.getObjectType() != null) {
			Element lvObjectTypeElement = new Element(WCMModule.NEW_OBJECTTYPE,
					IBMWCM_NS);
			lvObjectTypeElement.addContent(lvModule.getObjectType());
			pElement.addContent(lvObjectTypeElement);
		}

		if (lvModule.getContentType() != null) {
			Element lvContentTypeElement = new Element(
					WCMModule.NEW_CONTENTTYPE, IBMWCM_NS);
			lvContentTypeElement.addContent(lvModule.getContentType());
			pElement.addContent(lvContentTypeElement);
		}

		if (lvModule.getLibrary() != null) {
			appendElement(pElement, WCMModule.LIBRARY, lvModule.getLibrary());
		}

		if (lvModule.getDisplayTitle() != null
				&& lvModule.getDisplayTitle().length() > 0) {
			appendElement(pElement, WCMModule.DISPLAY_TITLE, lvModule
					.getDisplayTitle());
		}

		if (lvModule.getDefaultContent() != null
				&& lvModule.getDefaultContent().length() > 0) {
			appendElement(pElement, WCMModule.DEFAULTCONTENT, lvModule
					.getDefaultContent());
		}

		if (lvModule.getKeywords() != null
				&& lvModule.getKeywords().length() > 0) {
			appendElement(pElement, WCMModule.KEYWORDS, lvModule.getKeywords());
		}

		if (lvModule.getPublicationDate() != null) {
			Element lvPublicationDateElement = new Element(
					WCMModule.PUBLISHDATE, IBMWCM_NS);
			lvPublicationDateElement.addContent(lvModule.getPublicationDate()
					.toString());
			pElement.addContent(lvPublicationDateElement);
		}

		if (lvModule.getExpirationDate() != null) {
			appendElement(pElement, WCMModule.EXPIRATIONDATE, lvModule
					.getExpirationDate().toString());
		}

		if (lvModule.getGenDateOne() != null) {
			Element lvGenDateOneElement = new Element(WCMModule.GENDATEONE,
					IBMWCM_NS);
			lvGenDateOneElement.addContent(lvModule.getGenDateOne().toString());
			pElement.addContent(lvGenDateOneElement);
		}

		if (lvModule.getGenDateTwo() != null) {
			Element lvGenDateTwoElement = new Element(WCMModule.GENDATETWO,
					IBMWCM_NS);
			lvGenDateTwoElement.addContent(lvModule.getGenDateTwo().toString());
			pElement.addContent(lvGenDateTwoElement);
		}

		if (lvModule.getAuthors() != null && !lvModule.getAuthors().isEmpty()) {
			for (int i = 0; i < lvModule.getAuthors().size(); i++) {
				String lvAuthor = (String) lvModule.getAuthors().get(i);
				appendElement(pElement, WCMModule.AUTHOR, lvAuthor);
			}
		}

		if (lvModule.getOwners() != null && lvModule.getOwners().size() > 0) {
			for (int i = 0; i < lvModule.getOwners().size(); i++) {
				String lvOwner = (String) lvModule.getOwners().get(i);
				Element lvOwnerElement = new Element(WCMModule.OWNER, IBMWCM_NS);
				lvOwnerElement.addContent(lvOwner);
				pElement.addContent(lvOwnerElement);
			}
		}

		if (lvModule.getLocations() != null
				&& lvModule.getLocations().size() > 0) {
			for (int i = 0; i < lvModule.getLocations().size(); i++) {
				if (lvModule.getLocations().get(i) instanceof Path) {
					Path lvPath = (Path) lvModule.getLocations().get(i);

					Element lvPathElement = appendElement(pElement,
							WCMModule.NEW_LOCATION, (String) lvPath
									.getPathStr());
					if (lvPath.getLibrary() != null
							&& lvPath.getLibrary().length() > 0) {
						lvPathElement.setAttribute(WCMModule.LIBRARY_ATTRIBUTE,
								lvPath.getLibrary());
					}
				}
			}
		}

		if (lvModule.getAddlViewers() != null
				&& lvModule.getAddlViewers().size() > 0) {
			for (int i = 0; i < lvModule.getAddlViewers().size(); i++) {
				Element lvAdditionViewer = new Element(
						WCMModule.NEW_ADDLVIEWER, IBMWCM_NS);
				lvAdditionViewer.addContent((String) lvModule.getAddlViewers()
						.get(i));
				pElement.addContent(lvAdditionViewer);
			}
		}

		if (lvModule.getParents() != null && lvModule.getParents().size() > 0) {
			Element lvParents = new Element(WCMModule.NEW_PARENTS, IBMWCM_NS);
			for (int i = 0; i < lvModule.getParents().size(); i++) {
				String lvParentGuid = (String) lvModule.getParents().get(i);
				Element lvParent = new Element(WCMModule.PARENT, IBMWCM_NS);
				lvParent.addContent(lvParentGuid);
				lvParents.addContent(lvParent);
			}
			pElement.addContent(lvParents);
		}

		if (lvModule.getChildren() != null && !lvModule.getChildren().isEmpty()) {
			Element lvChildren = appendElement(pElement, WCMModule.CHILDREN,
					null);
			for (int i = 0; i < lvModule.getChildren().size(); i++) {
				String lvChildGuid = (String) lvModule.getChildren().get(0);
				appendElement(lvChildren, WCMModule.CHILD, lvChildGuid);
			}
		}

		if (lvModule.getUserEntitlements() != null
				&& lvModule.getUserEntitlements().size() > 0) {
			for (int i = 0; i < lvModule.getUserEntitlements().size(); i++) {
				Element lvAccessElement = new Element(
						WCMModule.NEW_ENTITLEMENT, IBMWCM_NS);
				lvAccessElement.setAttribute(WCMModule.TYPE_ATTRIBUTE,
						WCMModule.ENTITLEMENT_USER);
				lvAccessElement.addContent((String) lvModule
						.getUserEntitlements().get(i));
				pElement.addContent(lvAccessElement);
			}
		}

		if (lvModule.getWorkflow() != null) {
			Element lvWorkflowElement = new Element(WCMModule.WORKFLOW,
					IBMWCM_NS);
			lvWorkflowElement.setAttribute(WCMModule.NAME_ATTRIBUTE, lvModule
					.getWorkflow());
			if (lvModule.getWorkflowStage() != null) {
				Element lvWorkflowStageElement = new Element(
						WCMModule.WORKFLOWSTAGE, IBMWCM_NS);
				lvWorkflowStageElement.addContent(lvModule.getWorkflowStage());
				lvWorkflowElement.addContent(lvWorkflowStageElement);
			}
			pElement.addContent(lvWorkflowElement);
		}

		if (lvModule.getComponents() != null) {
			Collection lvComponents = lvModule.getComponents().values();
			Iterator lvIterator = lvComponents.iterator();
			while (lvIterator.hasNext()) {
				Component lvComponent = (Component) lvIterator.next();
				Element lvComponentElement = new Element(
						WCMModule.NEW_COMPONENT, IBMWCM_NS);
				lvComponentElement.setAttribute(WCMModule.NAME_ATTRIBUTE,
						lvComponent.getName());

				String lvType = lvComponent.getType();

				Element lvComponentType = new Element(WCMModule.COMPONENT_TYPE,
						IBMWCM_NS);
				lvComponentType.addContent(lvType);
				lvComponentElement.addContent(lvComponentType);

				if (Component.TYPE_HTML.equals(lvType)
						|| Component.TYPE_IMAGE.equals(lvType)
						|| Component.TYPE_FILE.equals(lvType)
						|| Component.TYPE_STYLESHEET.equals(lvType)) {
					Element lvComponentValue = new Element(
							WCMModule.COMPONENT_SOURCE, IBMWCM_NS);
					lvComponentValue.addContent(lvComponent.getContents());
					lvComponentElement.addContent(lvComponentValue);

					if (lvComponent.getFileName() != null
							&& lvComponent.getFileName().length() > 0) {
						Element lvComponentFilenameValue = new Element(
								WCMModule.COMPONENT_FILENAME, IBMWCM_NS);
						lvComponentFilenameValue.addContent(lvComponent
								.getFileName());
						lvComponentElement.addContent(lvComponentFilenameValue);

					}
				} else if (Component.TYPE_HTML_FILE.equals(lvType)) {
					Element lvComponentValue = new Element(
							WCMModule.COMPONENT_SOURCE, IBMWCM_NS);
					lvComponentValue.addContent(lvComponent.getContents());
					lvComponentElement.addContent(lvComponentValue);

				} else {
					Element lvComponentValue = new Element(
							WCMModule.COMPONENT_VALUE, IBMWCM_NS);
					lvComponentValue.addContent(lvComponent.getContents());
					lvComponentElement.addContent(lvComponentValue);
				}

				if (lvComponent.getFormat() != null) {
					appendElement(lvComponentElement,
							WCMModule.COMPONENT_FORMAT, lvComponent.getFormat());
				}

				if (lvComponent.getAltText() != null) {
					appendElement(lvComponentElement,
							WCMModule.COMPONENT_ALTTEXT, lvComponent
									.getAltText());
				}
				pElement.addContent(lvComponentElement);
			}
		}

		if (lvModule.getTmpltMaps() != null
				&& !lvModule.getTmpltMaps().isEmpty()) {
			for (int i = 0; i < lvModule.getTmpltMaps().size(); i++) {
				if (lvModule.getTmpltMaps().get(i) instanceof TemplateMap) {
					Element lvTemplateMap = appendElement(pElement,
							WCMModule.TMPLTMAP, null);

					TemplateMap lvMap = (TemplateMap) lvModule.getTmpltMaps()
							.get(i);
					appendElement(lvTemplateMap, WCMModule.TMPLTMAP_PRES, lvMap
							.getPresTmplt());
					appendElement(lvTemplateMap, WCMModule.TMPLTMAP_AUTH, lvMap
							.getAuthTmplt());
				}
			}
		}
	}

	private Element appendElement(Element pParent, String pTag, String pContent) {
		Element lvElement = new Element(pTag, IBMWCM_NS);
		lvElement.addContent(pContent);
		pParent.addContent(lvElement);
		return lvElement;
	}

	public String getNamespaceUri() {
		return WCMModule.URI;
	}

	public Set getNamespaces() {
		return NAMESPACES;
	}

	private static final String IBMWCM_URI = WCMModule.URI;
	private static final Namespace IBMWCM_NS;
	private static final Set NAMESPACES;

	static {
		IBMWCM_NS = Namespace.getNamespace("ibmwcm", IBMWCM_URI);
		Set nss = new HashSet();
		nss.add(IBMWCM_NS);
		NAMESPACES = Collections.unmodifiableSet(nss);
	}
}
